<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.*,java.io.*,org.apache.commons.fileupload2.*" %>
<%@ page import="org.apache.commons.fileupload2.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload2.servlet.ServletFileUpload" %>
<html>
<head>
    <title>FileUpload上传组件</title>
</head>
<body>
<%! // 对当前的上传操作做一些核心参数定义
    public static final Long MAX_SIZE = 3145728L; // 上传的最大长度为3M数据
    public static final Long FILE_MAX_SIZE = 1048576L; // 上传单个文件的最大值
    public static final String TEMP_DIR = "/temp/"; // 临时保存目录
    public static final String UPLOAD_DIR = "/upload/"; // 目标存储路径
    public static final String DEFAULT_ENCODING = "UTF-8"; // 文本编码
%>
<%
    request.setCharacterEncoding(DEFAULT_ENCODING); // 请求编码配置
    DiskFileItemFactory factory = new DiskFileItemFactory(); // 磁盘管理类
    factory.setRepository(new File(TEMP_DIR)); // 临时存储目录
    ServletFileUpload fileUpload = new ServletFileUpload(factory); // 上传处理的核心类
    fileUpload.setSizeMax(MAX_SIZE); // 上传的最大容量
    fileUpload.setFileSizeMax(FILE_MAX_SIZE); // 单个文件的最大容量
    if (fileUpload.isMultipartContent(request)) {   // 当前存在有文件上传
        Map<String, List<FileItem>> map = fileUpload.parseParameterMap(request); // 解析全部的上传文件
        for (Map.Entry<String, List<FileItem>> entry : map.entrySet()) {    // 全部上传项迭代
            String paramName = entry.getKey(); // 请求参数的名称
            List<FileItem> allItems = entry.getValue(); // 不管是单个的参数还是一组参数接收方式相同
%>
            <p><%=paramName%>：
<%
            for (FileItem item : allItems) {    // 获取内容
                if (item.isFormField()) {   // 文本数据内容
%>
                    <%=item.getString(DEFAULT_ENCODING)%>
<%
                } else {    // 不属于文本参数
                    if (item.getSize() > 0) {   // 文件选择框选中了文件
                        // 使用UUID工具类实现一个自动命名的处理
                        String fileName = UUID.randomUUID() + "." + item.getContentType().substring(item.getContentType().lastIndexOf("/") + 1);
                        String filePath = application.getRealPath(UPLOAD_DIR) + fileName; // 文件的存储路径配置
                        item.write(new File(filePath)); // 文件的保存
                        item.delete(); // 清空上传信息
%>
                        <img src="<%=request.getContextPath()%>/upload/<%=fileName%>" style="width: 150px;">
<%
                    }
                }
            }
        }
    }
%>
</body>
</html>
